/* 
 * File:   OperationUnaire.cpp
 * Author: Gab'z
 * 
 * Created on 2 mai 2012, 17:18
 */
/*
 * SUM ajoute Constante* à la pile
 * MEAN ajoute Constante* à la pile
 * 
 * SIGN ajoute Constante* à la pile
 * 
 * SIN ajoute Constante* à la pile
 * COS ajoute Constante* à la pile
 * TAN ajoute Constante* à la pile
 * SINH ajoute Constante* à la pile
 * COSH ajoute Constante* à la pile
 * TANH ajoute Constante* à la pile
 * LN ajoute Constante* à la pile
 * LOG ajoute Constante* à la pile
 * INV ajoute Constante* à la pile
 * SQRT ajoute Constante* à la pile
 * SQR ajoute Constante* à la pile
 * CUBE ajoute Constante* à la pile
 * ! FACT ajoute Constante* à la pile
 * EVAL n'ajoute pas forcément une constante à la pile
 * 
 */
#include "OperateurUnaire.h"
#include "Expression.h"
#include "operator_exception.h"

OperateurUnaire::~OperateurUnaire() {
}

void OperateurUnaire::exec(Pile* pile) const throw (OperatorException) {
    if (pile->size() < 1) throw OperatorException("Pas assez d'arguments pour un opérateur unaire"); // (" + pile->size() + ")");
    const Constante* c = 0;
    const Constante* c1 = pile->getConstante(1)->clone();
    const Expression* exp1 = dynamic_cast<const Expression*> (c1);
    if (exp1 != 0) {
        c = new Expression(exp1->toString());
        delete exp1;
    }
    if (c != 0) {
        pile->pop();
        pile->push(c);
        delete c;
    } else {
        try {
            c = apply(c1);
        } catch (OperatorException e) {
            throw OperatorException(e.what());
        }
        if (c != 0) {
            delete c1;
            pile->pop();
            pile->push(c);
            delete c;
        }
    }

}